"""
Присвоение своих имён для команд Чио (/a = /aaa bbb !c)

- Присвоение имён для команд (алиасы).
- Локальные и глобальные алиасы.
- Просмотр списка алиасов.
- Управление пользовательскими и глобальными алиасами.
- удаление всех алиасов.

Author: Milinuri Nirvalen
Ver: 1.3.1 (6)
"""

from chiori import Config
from chiori import Plugin


p = Plugin(name='алиасы',
	desc= 'присвоение имён для комманд (a = /a b)',
	args={
		'keys': 'имя алиаса',
		'value': 'значение алиаса',
		'*': '*/all/все'
	},
	path='data/aliases/')


# func
# ====

def list_aliases(event):
	c = Config(filepath= f'{p.dpath}global.toml').file_data
	ua = Config(filepath= f'{p.dpath}{event.get("from.id")}.toml').file_data

	text = f'список алиасов ({len(c)}):'
	for k, v in c.items():
		text += f'\n-- {k} = "{v}"'

	text += f'\n\nпользовательские алиасы ({len(ua)}):'
	for k, v in ua.items():
		text += f'\n-- {k} = "{v}"'
	return text

def add_alias(c, event, args):
	'''добавляет алиас в словарь
	:param c: экземпляр Config с требуемым файлом
	:param args: текст от пользователя

	:return: текст результата'''

	if len(args) >= 2:
		c.file_data[args[0]] = " ".join(args[1:])
		c.save()
		return f'{args[0]} = "{" ".join(args[1:])}"'
	if not len(args):
		return list_aliases(event)
	if args[0] in c.file_data:
		return f'{args[0]} = "{c.file_data[args[0]]}"'
	else:
		return f'{args[0]}: не задан алиас'

def rm_alias(c, args):
	'''удаляет алиасы из словаря
	:param c: экземпляр Config с требуемым файлом
	:param args: текст от пользователя

	:return: текст результата'''

	if args in ['*', 'all', 'все']:
		c.file_data = {}
		text += 'все алиасы удалены.'

	else:
		text = 'удаление алиасов:'
		for a in args.split(' '):
			print(c.file_data)
			if a in c.file_data:
				del c.file_data[a]
				text += f'\n-- "{a}" удалено'
			else:
				text += f'\n-- "{a}" не алиас'

	c.save()
	return text


# handlers
# ========

@p.eventHandler('after')
async def _(event, ctx):
	ua = Config(filepath= f'{p.dpath}{event.get("from.id")}.toml').file_data
	ga = Config(None, {'!e': '/echo'}, f'{p.dpath}global.toml').file_data
	text = event.get('text', '').split(' ', 1)

	if len(text) == 1:
		text.append('')

	if text[0] in ua:
		alias = ua[text[0]]
	elif text[0] in ga:
		alias = ga[text[0]]
	else:
		alias = None

	if alias:
		e = event
		e.model['text'] = alias + ' ' + ' '.join(text[1:])

		await ctx.app.messageEvent(e, True)


# aliases list: all
# =================

@p.command('aliases', 'алиасы', usage='вывести список алиасов')
async def getAliases(event, ctx):
	await ctx.message(list_aliases(event))


# add alias: user / global
# ========================

@p.command('alias', 'алиас', usage='<key> [value] запсать алиас')
async def setAlias(event, ctx):
	c = Config(filepath=f'{p.dpath}{event.get("from.id")}.toml')
	await ctx.message(add_alias(c, event, ctx.args))

@p.command('<g(lobal) alias>',
	usage='<key> [value] записать алиас для всех пользователей',
	admins=True)
async def setGlobalAlias(event, ctx):
	c = Config(filepath=f'{p.dpath}global.toml')
	await ctx.message(add_alias(c, event, ctx.args))


# remove aliases: user / global
# =============================

@p.command('delalias(es)', usage='<keys/*> удалить алиасы')
async def delAlias(event, ctx):
	c = Config(filepath=f'{p.dpath}{event.get("from.id")}.toml')
	await ctx.message(rm_alias(c, ctx.sargs))

@p.command('delgalias(es)', 'delglobalalias(es)',
	usage='<keys/*> удалить алиасы для всех пользователей',
	admins=True)
async def delGlobalAlias(event, ctx):
	c = Config(filepath=f'{p.dpath}global.toml')
	await ctx.message(rm_alias(c, ctx.sargs))
